package negocio;


import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hibernate.criterion.Order;
import basicas.Artista;
import basicas.CaracteristicaSetor;
import basicas.Evento;
import basicas.Ingresso;
import basicas.Local;
import basicas.LoginInvalido;
import basicas.Produtora;
import basicas.SetorLocal;
import basicas.Usuario;
import basicas.organizacionais.Funcao;
import basicas.organizacionais.Funcionario;
import basicas.organizacionais.Setor;
import dados.geral.ArtistaDAO;
import dados.geral.CaracteristicaSetorDAO;
import dados.geral.DAOFactory;
import dados.geral.EventoDAO;
import dados.geral.FuncaoDAO;
import dados.geral.FuncionarioDAO;
import dados.geral.IngressoDAO;
import dados.geral.LocalDAO;
import dados.geral.ProdutoraDAO;
import dados.geral.SetorDAO;
import dados.geral.SetorLocalDAO;
import dados.geral.UsuarioDAO;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;


public class Controlador {

	private FuncaoDAO daoFuncao;	
	private SetorDAO daoSetor;	
	private FuncionarioDAO daoFuncionario;	
	private LocalDAO daoLocal;	
	private SetorLocalDAO daoSetorLocal;	
	private CaracteristicaSetorDAO daoCaracteristicaSetor;    
	private ArtistaDAO daoArtista;   
    private ProdutoraDAO daoProdutora;
    private EventoDAO daoEvento;
    private Funcionario funcionario;
    private Funcao funcao;
    private Setor setor;
    private Artista artista;
    private UsuarioDAO daoUsuario;
    private IngressoDAO daoIngresso;
   	
	
	public Controlador() {
		daoFuncao = DAOFactory.getFuncaoDAO();
		
		daoEvento = DAOFactory.getEventoDAO();
		
		daoSetor = DAOFactory.getSetorDao();
		
		daoFuncionario = DAOFactory.getFuncionarioDao();
		
		daoLocal = DAOFactory.getLocalDao();
		
		daoSetorLocal = DAOFactory.getSetorLocalDao();
		
		daoCaracteristicaSetor = DAOFactory.getCaracteristicaSetorDao();
       
		daoArtista = DAOFactory.getArtistaDAO();
		
		daoProdutora = DAOFactory.getpProdutoraDAO();
		
		daoUsuario = DAOFactory.getUsuarioDAO();
		
		daoIngresso = DAOFactory.getIngressoDAO();
		
		funcionario = new Funcionario();
                
                funcao = new Funcao();
                
                setor = new Setor();
                
                artista = new Artista();
		 

	}

//INICIO FUNCIONARIO
	public void inserirFuncionario(Funcionario objeto) {                
                funcionario.setNome(objeto.getNome());
                List<Funcionario> funList = daoFuncionario.pesquisar(funcionario);                
                if(funList.size() > 0){
                    this.mostrarMsg("Ja existe um funcionario com esse nome!");
                }else{
                    daoFuncionario.inserir(objeto);
                    this.mostraInserido();
                }
	}

	public final void alterarFuncionario(Funcionario objeto) {
		daoFuncionario.alterar(objeto);                
                this.mostrarAlterado();
	}

	public final void removerFuncionario(Funcionario objeto) {
		daoFuncionario.remover(objeto);
	}

	public final List<Funcionario> pesquisarFuncionario(Funcionario objeto) {
		return daoFuncionario.pesquisar(objeto);
	}
        
        public final Funcionario getFuncionarioByCodigo(int codigo){
                return daoFuncionario.buscarPorChave(codigo);
        }

	public List<Funcionario> listarFuncionarios() {
		return daoFuncionario.listarTodos();
	}
//FIM FUNCIONARIO
//////////////////////////////////////////////////////////////////////////////
	
	
	public Local alterar(Local objeto) {
		return daoLocal.alterar(objeto);
	}

	public List<SetorLocal> listarTodosSetoresLocal() {
		return daoSetorLocal.listarTodos();
	}

	public void inserir(Local objeto) {
		daoLocal.inserir(objeto);
	}

	public final void removerLocal(Local objeto) {
		daoLocal.remover(objeto);
	}

	public final List<Local> pesquisarLocal(Local objeto) {
		return daoLocal.pesquisar(objeto);
	}

	
	
	
	public List<CaracteristicaSetor> listarTodasCaracteristicas() {
		return daoCaracteristicaSetor.listarTodos();
	}
	
	

	public final Local buscarLocalPorChave(Serializable chave) {
		return daoLocal.buscarPorChave(chave);
	}

	public List<Local> listarTodosLocais() {
		return daoLocal.listarTodos();
	}

	

	public SetorLocal alterar(SetorLocal objeto) {
		return daoSetorLocal.alterar(objeto);
	}

	
	
	public void inserirCaracteristica(CaracteristicaSetor objeto) {
		
		daoCaracteristicaSetor.inserir(objeto);
	}
	

	public void inserir(SetorLocal objeto) {
		daoSetorLocal.inserir(objeto);
	}

	public final void remover(SetorLocal objeto) {
		daoSetorLocal.remover(objeto);
	}

	public void removerCaracteristica(CaracteristicaSetor objeto) {
		daoCaracteristicaSetor.remover(objeto);
		
	}
	

	public List<SetorLocal> listarTodosSetorLocal(Integer indiceInicial,
			Integer quantidade) {
		return daoSetorLocal.listarTodos(indiceInicial, quantidade);
	}

	
	
//INICIO ARTISTA
        
        public void inserirArtista(Artista objeto){
             artista.setNome(objeto.getNome());
                List<Artista> artList = daoArtista.pesquisar(artista);                
                if(artList.size() > 0){
                    this.mostrarMsg("Ja existe um artista com esse nome!");
                }else{
                    daoArtista.inserir(objeto);
                    this.mostraInserido();
                }                 
        }
        
        public final void alterarArtista(Artista objeto) {
		daoArtista.alterar(objeto);
                this.mostrarAlterado();
	}

	public final void removerArtista(Artista objeto) {
		daoArtista.remover(objeto);
                this.mostrarRemovido();
	}

	public final List<Artista> pesquisarArtista(Artista objeto) {
		return daoArtista.pesquisar(objeto);
	}
        
        public final Artista getArtistaByCodigo(int codigo){
                return daoArtista.buscarPorChave(codigo);
        }
        
        
        public List<Artista> listarArtistas(){
            return daoArtista.listarTodos();
        }
        
//FIM ARTISTA        
//////////////////////////////////////////////////////////////////////////////        
//INICIO SETOR
        
        public void inserirSetor(Setor objeto) {
            setor.setDescricao(objeto.getDescricao());
                List<Setor> setList = daoSetor.pesquisar(setor);                
                if(setList.size() > 0){
                    this.mostrarMsg("Ja existe um setor com essa descrição!");
                }else{
                    setor.setDescricao("");
                    setor.setSigla(objeto.getSigla());
                    setList = daoSetor.pesquisar(setor);                
                    if(setList.size() > 0){
                        this.mostrarMsg("Ja existe um setor com essa sigla!");
                    }else{
                        daoSetor.inserir(objeto);
                        this.mostraInserido();
                    }                    
                }                        
	}
        
        public final void alterarSetor(Setor objeto) {
		daoSetor.alterar(objeto);
                this.mostrarAlterado();
	}

	public final void removerSetor(Setor objeto) {
		daoSetor.remover(objeto);
                this.mostrarRemovido();
	}

	public final List<Setor> pesquisarSetor(Setor objeto) {
		return daoSetor.pesquisar(objeto);
	}
        
        public final Setor getSetorByCodigo(int codigo){
                return daoSetor.buscarPorChave(codigo);
        }
        
        public List<Setor> listarSetores(){
            return daoSetor.listarTodos();
        }
//FIM SETOR
//////////////////////////////////////////////////////////////////////////////                      
//INICIO FUNCAO        
        public void alterarFuncao(Funcao objeto) {                
		daoFuncao.alterar(objeto);        
                this.mostrarAlterado();
	}

	public void inserirFuncao(Funcao objeto) {
                funcao.setNome(objeto.getNome());
                List<Funcao> funList = daoFuncao.pesquisar(funcao);                
                if(funList.size() > 0){
                    this.mostrarMsg("Ja existe uma função com esse nome!");
                }else{
                    daoFuncao.inserir(objeto);
                    this.mostraInserido();
                }                        
	}
	
	public final void inserirColecaoFuncoes(Collection<Funcao> colecao) {
		daoFuncao.inserirColecao(colecao);
	}

	public final void removerFuncao(Funcao objeto) {
		daoFuncao.remover(objeto);
                this.mostrarRemovido();
	}

	public final Funcao getFuncaoByCodigo(int codigo){
                return daoFuncao.buscarPorChave(codigo);
        }
        
	public List<Funcao> listarFuncoes(){
		return daoFuncao.listarTodos();
	}

//FIM FUNCAO
//////////////////////////////////////////////////////////////////////////////        

	
	// ********************* EVENTO ************************** //
	
	public Evento alterarEvento(Evento objeto) {
		return daoEvento.alterar(objeto);
	}

	public void inserirEvento(Evento objeto) {
		daoEvento.inserir(objeto);
	}

	public final void inserirColecaoEvento(Collection<Evento> colecao) {
		daoEvento.inserirColecao(colecao);
	}

	public final void removerEvento(Evento objeto) {
		daoEvento.remover(objeto);
	}

	public final Evento buscarEventoPorChave(Serializable chave) {
		return daoEvento.buscarPorChave(chave);
	}
	
	
	public List<Evento> listarTodosEvento(){
		return daoEvento.listarTodos();
	}	
	
	// ********************* FIM EVENTO ************************** //


	

	
	
//---------------------------------produtora----------------------------\\


	
	public void inserirProdutora(Produtora objeto) {
		daoProdutora.inserir(objeto);
	}
	
	
	
	public final void remover(Produtora objeto) {
		daoProdutora.remover(objeto);
	}
	
	
	public List<Produtora> listarTodosProdutora() {
		
		return daoProdutora.listarTodos();
		
		}
	
	
	
	 public final void alterarProdutora(Produtora objeto) {
		 daoProdutora.alterar(objeto);
	    }
	
	
	public final Produtora buscarProdutoraPorChave(Serializable chave) {
		return daoProdutora.buscarPorChave(chave);
	}
	
	
	public final Usuario efetuarLogin(Usuario objeto) throws LoginInvalido {
		Usuario usuario = new Usuario();
		usuario.setLogin(objeto.getLogin());
		usuario.setSenha(objeto.getSenha());
		
		
		List<Usuario> usuarios = daoUsuario.pesquisarExato(usuario);
		if (usuarios == null || usuarios.isEmpty()){
			throw new LoginInvalido();
		} else {
			return usuarios.get(0);
		}
			
	

	}
	
	
	//---------------------------------fim produtora----------------------------\\


	
        public void mostraInserido(){            
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Inserido com Sucesso", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        
        public void mostrarAlterado(){            
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Alterado com Sucesso", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        
        public void mostrarRemovido(){
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Removido com Sucesso", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        
        public void mostrarMsg(String pmsg){
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,pmsg, "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

        
        
        
     // ********************* INGRESSO ************************** //
        
		

		public Ingresso alterarIngresso(Ingresso objeto) {
			return daoIngresso.alterar(objeto);
		}

		public void inserirIngresso(Ingresso objeto) {
			daoIngresso.inserir(objeto);
		}

		public final void removerIngresso(Ingresso objeto) {
			daoIngresso.remover(objeto);
		}

		public final Ingresso buscarIngressoPorChave(Serializable chave) {
			return daoIngresso.buscarPorChave(chave);
		}

		public void inserirUsuario(Usuario objeto) {
			daoUsuario.inserir(objeto);
		}

		
		public List<Ingresso> listarTodosIngressos() {
			return daoIngresso.listarTodos();
		}

		public int gerarIngressos(Evento objeto) {
			int cont = 0;
			
			
			
			try{
				
				List<SetorLocal> listaSetores = objeto.getLocal().getSetorLocal();
				
				for (Iterator iterator = listaSetores.iterator(); iterator.hasNext();) {
					SetorLocal setorLocal = (SetorLocal) iterator.next();
					for (int i = 0; i < setorLocal.getQtdMaxPessoas(); i++) {
						Ingresso ingresso = new Ingresso();						
						ingresso.setEvento(objeto);
						ingresso.setSetorLocal(setorLocal);
						ingresso.setVendido(0);
						daoIngresso.inserir(ingresso);
						cont++;
					}
					
				}
				
					
				}catch (Exception e) {
				
				}
				
				
			return cont; 
			}
			
                public List<Ingresso> listarIngressosEvento(Evento evt){
                    Ingresso ingressop = new Ingresso();
                    ingressop.setEvento(evt);
                    return daoIngresso.pesquisar(ingressop);
                }
                
                public void venderIngresso(int pcodingresso){
                    Ingresso ingresso = daoIngresso.buscarPorChave(pcodingresso);
                    ingresso.setVendido(1);
                    try {
                        daoIngresso.alterar(ingresso);
                        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,"Ingresso Vendido", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);
                        
                    } catch (Exception e) {
                        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);
                    }                    
                }
	
}



